package br.usjt.component.login.beans;

import static br.com.usjt.component.commons.login.util.ValidationUtil.isNull;
import static br.com.usjt.component.commons.login.util.ValidationUtil.not;
import static br.usjt.component.login.assembler.UsuarioAssembler.converterParaListaUsuarioDTOsUsando;
import static br.usjt.component.login.assembler.UsuarioAssembler.converterParaUsuarioDTOUsando;
import static br.usjt.component.login.assembler.UsuarioAssembler.converterParaUsuarioUsando;
import static br.usjt.component.login.assembler.UsuarioAssembler.toEntityAttached;

import java.util.List;

import javax.ejb.LocalBean;
import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.inject.Inject;

import br.usjt.component.login.dto.UsuarioDTO;
import br.usjt.component.login.facade.UsuarioBeanRemote;
import br.usjt.component.login.facade.dao.LoginDao;
import br.usjt.component.login.facade.dao.UsuarioDao;
import br.usjt.component.login.model.Login;
import br.usjt.component.login.model.Usuario;

@Stateless
@LocalBean
@Remote(UsuarioBeanRemote.class)
public class UsuarioBean extends AbstractBean implements UsuarioBeanRemote {

    private static final long serialVersionUID = -541137584437624433L;

    @Inject
    private UsuarioDao dao;
    @Inject
    private LoginDao daoLogin;

    public UsuarioBean() {
    }

    @Override
    public void salvar(UsuarioDTO dto) {
        validarDTO(dto);
        Usuario usuario = converterParaUsuarioUsando(dto);

        Login login = usuario.getLogin();
        if (not(isNull(login)) && not(isNull(login.getId()))) {
            Login loginAux = daoLogin.findById(login.getId());
            usuario.setLogin(null);
            dao.save(usuario);
            usuario.setLogin(loginAux);
            dao.update(usuario);
        } else {
            dao.save(usuario);
        }
    }

    @Override
    public void atualizar(UsuarioDTO dto) {
        validarDTO(dto);
        Usuario usuarioConvertido = converterParaUsuarioUsando(dto);

        Usuario usuarioDetached = dao.findById(usuarioConvertido.getId());
        toEntityAttached(usuarioConvertido, usuarioDetached);

        Login login = usuarioConvertido.getLogin();
        if (not(isNull(login)) && not(isNull(login.getId()))) {
            Login logi = daoLogin.findById(login.getId());
            usuarioDetached.setLogin(logi);
        }

        dao.update(usuarioDetached);
    }

    @Override
    public void deletar(UsuarioDTO dto) {
        validarDTO(dto);

        if (dto.isAtivo()) {
            dto.setAtivo(false);
        }
        atualizar(dto);
    }

    @Override
    public UsuarioDTO consultarPorCPF(String cpf) {
        validarInformacao(cpf);

        Usuario usuario = dao.findByCPF(cpf);

        return converterParaUsuarioDTOUsando(usuario);

    }

    @Override
    public UsuarioDTO consultarPorEmail(String email) {
        validarInformacao(email);

        Usuario usuario = dao.findByEmail(email);

        return converterParaUsuarioDTOUsando(usuario);
    }

    @Override
    public List<UsuarioDTO> consultarTodosUsuarios() {
        List<Usuario> usuarios = dao.findByAll();
        return converterParaListaUsuarioDTOsUsando(usuarios);
    }

}
